﻿// Buffer.cs created with MonoDevelop
// User: renato at 00:12 20/5/2008
//
// To change standard headers go to Edit->Preferences->Coding->Standard Headers
//

using System;
using System.IO;
using System.Text;

namespace compilador
{
	
	
	public class Buffer
	{
		FileStream Arquivo;
		int InicioBuff = 0;
		int FimBuff = -1;

		public void armazenaInicioBuff(){
			InicioBuff = FimBuff;
		}
		public void restauraInicioBuff()
		{
			FimBuff = InicioBuff;
		}
		
		public void retrocede(int pQuantChar)
		{
			if ((FimBuff - pQuantChar) < -1)
				Console.WriteLine("Erro na funcao Lexica");
			else
				FimBuff -= pQuantChar;
		}
		public bool eValido(char c)
		{
			char[] Validos = {'<','>',':','=','+','-','*','/','.',';',',','{','}','(',')'};
			//Console.WriteLine(c);
			if (Char.IsLetterOrDigit(c))
				return true;
			if (Array.IndexOf(Validos,c)> -1)
				return true;
			if (char.IsWhiteSpace(c) || Convert.ToInt32(c).Equals(10))
				return true;
			Console.WriteLine("Caractere invalido encontrado: {0}",c);
			return false;
		}
		
		public char proxChar()
		{
			FimBuff++;
			Arquivo.Seek(FimBuff,SeekOrigin.Begin);
			int b = Arquivo.ReadByte();
			if (b == -1)
				return '¶';
			while (!eValido(Convert.ToChar(b)))
				b = Arquivo.ReadByte();
			//Console.WriteLine(b.ToString()+" "+Convert.ToChar(b));			
			return Convert.ToChar(b);
		}
		
		public string retornaCadeia(){
			Arquivo.Seek(InicioBuff,SeekOrigin.Begin);
			int TamString = FimBuff - InicioBuff;
			byte[] s = new byte[TamString];
			Arquivo.Read(s,0,TamString);
			InicioBuff = FimBuff +1;		
			return Encoding.ASCII.GetString(s);
		}
		
		public Buffer(String pArquivo)
		{
			if (File.Exists(pArquivo)){
			  Arquivo = new FileStream(pArquivo,FileMode.Open);
			  Console.WriteLine("Arquivo carregado com sucesso");
			}else
		      Console.WriteLine("Arquivo nao encontrado");			
		}

        public void FechaArquivo()
        {
            Arquivo.Close();
        }
		
		public bool fimDoArquivo(){
			Arquivo.Seek(FimBuff,SeekOrigin.Begin);
			int b = Arquivo.ReadByte();			
			return b == -1;
		}
	}
}
